package devcken.utility;

import java.util.Arrays;

public class ByteUtils
{
	/**
	 * byte 배열에서 다른 byte 배열의 위치를 찾아낸다.
	 * @param target 검색 대상 byte 배열을 설정한다.
	 * @param search 검색 대상 byte 배열에서 찾아낼 byte 배열을 설정한다.
	 * @return 검색 대상 byte 배열에서 찾아낸 위치를 반환한다. 찾지 못하면 -1이 반환된다.
	 */
	public static int indexOf(byte[] target, byte[] search)
	{
		if (target == null ||
				search == null ||
				search.length > target.length)
		{
			return -1;
		}
		
		byte crumb = search[0];
		
		byte[] nextTarget = target.clone();
		
		int crumbPosition = -1;
		
		do
		{
			crumbPosition = Arrays.binarySearch(target, crumb);
			
			if (crumbPosition > -1)
			{
				byte[] candidate = new byte[search.length];
				
				System.arraycopy(nextTarget, crumbPosition, candidate, 0, candidate.length);
				
				for (int index = 0; index < search.length; index++)
				{
					if (Byte.compare(candidate[index], search[index]) != 0)
					{
						break;
					}
					
					if (index + 1 == search.length)
					{
						return crumbPosition;
					}
				}
			}
			
			byte[] temp = new byte[nextTarget.length - crumbPosition];
			
			System.arraycopy(nextTarget, crumbPosition, temp, 0, nextTarget.length - crumbPosition);
			
			nextTarget = temp;
			
			
		}
		while(crumbPosition > -1);
		
		return -1;
	}
}